home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
tvdmx.exe
/
DMXGIZMA.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-07-16
|
14KB
|
504 lines
{■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
{ }
{ DMXGIZMA --constants, variables and functions }
{ tvDMX --data editing project (ver 1.5) }
{ }
{ Copyright (c) 1992 Randolph Beck }
{ P.O. Box 56-0487 }
{ Orlando, FL 32856 }
{ CIS: 72361,753 }
{ }
{■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
Unit DMXGIZMA;
{$V-,X+,O+,D-,B-,R- }
interface
uses Objects, Drivers, Views, App, RSet;
{$DEFINE tvDMX1A }
const
cmDMX = 4400;
cmDMX_RollCall = cmDMX + 1;
cmDMX_Ack = cmDMX + 2;
cmDMX_Enter = cmDMX + 3;
cmDMX_FieldAltered = cmDMX + 4;
cmDMX_Draw = cmDMX + 5;
cmDMX_DrawData = cmDMX + 6;
cmDMX_Lock = cmDMX + 7;
cmDMX_LockData = cmDMX + 8;
cmDMX_Unlock = cmDMX + 9;
cmDMX_UnlockData = cmDMX + 10;
cmDMX_FixSize = cmDMX + 11;
cmDMX_ZeroizeRec = cmDMX + 12;
cmDMX_WrongKey = cmDMX + 13;
cmDMX_Left = cmDMX + 15;
cmDMX_Right = cmDMX + 16;
cmDMX_Home = cmDMX + 18;
cmDMX_End = cmDMX + 19;
cmDMX_goto = cmDMX + 20;
cmDMX_NextRow = cmDMX + 21;
cmDMX_Up = cmDMX + 22;
cmDMX_Down = cmDMX + 23;
cmDMX_PgUp = cmDMX + 24;
cmDMX_PgDn = cmDMX + 25;
cmDMX_ScreenTop = cmDMX + 26;
cmDMX_ScreenBottom = cmDMX + 27;
cmDMX_Top = cmDMX + 28;
cmDMX_Bottom = cmDMX + 29;
{ +------------ 1 normal fields }
{ | +---------- 2 normal selected field }
{ | | +-------- 3 read-only selected field }
{ | | | +------ 4 locked field }
{ | | | | +---- 5 delimiter }
{ | | | | | +-- 6 border }
{ | | | | | | }
cDMX : string [6] = #6#7#5#5#1#2;
accNormal = 0;
accReadOnly = 1;
accHidden = 2;
accSkip = 4;
accDelimiter = 8;
showTRUE = '■'; { TRUE indicator }
showFALSE = ' '; { FALSE indicator }
showOVERFLOW = '*'; { overflow indicator for numbers }
fldSTR = 'S'; { string field }
fldSTRNUM = '#'; { numeric string field }
fldCHAR = 'C'; { character field }
fldCHARNUM = '0'; { numeric character field }
fldCHARVAL = 'N'; { dbase formatted numeric field }
fldBYTE = 'B'; { byte field }
fldSHORTINT = 'J'; { shortint field }
fldWORD = 'W'; { word field }
fldINTEGER = 'I'; { integer field }
fldLONGINT = 'L'; { longint field }
fldREALNUM = 'R'; { real number field (uses TREALNUM) }
fldBOOLEAN = 'X'; { boolean value field }
fldHEXVALUE = 'H'; { hexadecimal numeric entry }
fldZEROMOD = 'Z'; { zero modifier }
{ Complex fields: }
fldDATE = ' WW-'^F^Z + ^U+char(12) + ^P+char(2) +
#0'ZW-'^Z + ^U+char(31) +
#0'ZZZW '^Z^F + ^P+char(-6) +
#0 + ^P+char(4);
fldTIME = ' WW:'^F^Z + ^U+char(23) +
#0'ZW '^Z + ^U+char(59) +
#0'W'^F^H#0; { seconds are hidden }
fldDATETIME = ' WW-'^F^Z + ^U+char(12) + ^P+char(2) +
#0'ZW-'^Z + ^U+char(31) +
#0'ZZZW '^Z^F + ^P+char(-6) +
'\' + ^P+char(4) +
' WW:'^F^Z + ^U+char(23) +
#0'ZW:'^Z + ^U+char(59) +
#0'ZW '^Z^F + ^U+char(59); { seconds are not hidden }
type
pDMXfieldrec = ^tDMXfieldrec;
tDMXfieldrec = RECORD { these records describe each field for tvDMX }
Next,Prev : pDMXfieldrec;
access : byte; { read-only, hidden, skip }
fieldnum : byte; { 1..totalfields (0=none) }
screentab : integer; { virtual column num. }
typecode : char; { 's', 'r', etc. }
fillvalue : char; { #0 or ' ' }
upperlimit : byte; { maximum value limit }
showzeroes : boolean; { display zero values }
truelen : byte; { unformatted text length }
parenthesis : boolean; { '('/')' characters }
decimals : byte; { decimal point }
fieldsize : integer; { sizeof (datatype) }
datatab : integer; { position in record }
template : pstring; { field template }
end;
showcodes = (showanyway, shownegative, showregular);
showset = set of showcodes; { used when displaying fields }
function DmxStrLen (S : string) : integer;
{ returns the length of the visible portions of a tvDMX template string }
function FieldString (fieldrec : pDMXfieldrec;
Show : showset; var DataRec ) : string;
{ returns a display string from a tvDMX field record }
implementation
{ ══════════════════════════════════════════════════════════════════════ }
function DmxStrLen (S : string) : integer;
var i,Len,Ttl : integer;
h : boolean;
procedure ResetDelimiter (D : boolean);
begin
If not h then Ttl := Ttl + Len;
If D then Inc (Ttl);
Len := 0;
h := FALSE;
end;
begin
h := FALSE;
Ttl := 0;
Len := 0;
i := 0;
While (i < length (S)) do
begin
Inc (i);
Case S [i] of
'~':
begin
Inc (i);
While (S [i] <> '~') and (i < length (S)) do
begin
Inc (Len);
Inc (i);
end;
end;
^P, ^U, ^V: Inc (i);
^H: h := TRUE;
^D:
begin
ResetDelimiter (TRUE);
Inc (i);
end;
#0,'\','|','│','║':
begin
ResetDelimiter (S [i] <> #0);
end;
^A..^Z: begin end;
else Inc (Len);
end;
end;
ResetDelimiter (FALSE);
DmxStrLen := Ttl;
end;
{ ══════════════════════════════════════════════════════════════════════ }
function FieldString (fieldrec : pDMXfieldrec;
Show : showset; var DataRec ) : string;
var i,j,Len : integer;
C : char;
Numbers : boolean;
ItsBlank : boolean;
Q : boolean;
A,T : string;
R : TREALNUM;
Data : pointer;
DataBool : pboolean absolute Data;
DataByte : pbyte absolute Data;
DataShort : pshortint absolute Data;
DataInt : pinteger absolute Data;
DataWord : pword absolute Data;
DataLong : plongint absolute Data;
DataReal : PREALNUM absolute Data;
DataStr : pstring absolute Data;
function HexByte (Number : byte) : string;
const bts : array [0..15] of char = '0123456789ABCDEF';
begin
HexByte := bts [(Number shr 4) and $0F] + bts [Number and $0F]
end;
function BlankField : boolean;
var i : word;
begin
BlankField := TRUE;
If Len > 0 then
For i := 0 to pred (fieldrec^.fieldsize) do
If DataStr^ [i] <> #0 then BlankField := FALSE;
end;
function CheckBlank (Zero : boolean) : boolean;
begin
If (Zero) and not ((fieldrec^.showzeroes) or (showanyway in Show)) then
begin
fillchar (A [1], Len, ' ');
A [0] := chr (Len);
ItsBlank := TRUE;
CheckBlank := TRUE;
end
else
CheckBlank := FALSE;
end;
procedure FormNum (sign : boolean);
{ length of A[] must equal Len + 1 }
var i,j : integer;
cc : char;
begin
With fieldrec^ do
begin
If sign and (shownegative in Show) then
begin
i := 1;
While (A [i] = ' ') do Inc (i);
If (i > 1) then A [pred (i)] := '-';
end;
If (parenthesis) then
begin
If sign then
begin
T [pos ('(', T)] := ' ';
T [pos (')', T)] := ' ';
end
else
begin
A [pos ('-', A)] := ' ';
If length (A) >